#include <iostream>
#include <string>
#include <stdlib.h>

#include "validator.h"

using namespace std;

void print_usage_exit() {
#include "pony.dump"
	cout << pony << endl;
	cout << "Usage :\nparser file.xml [file.dtd]" << endl;
	cout << "Si file.dtd est précisé, le document de définition donné dans le fichier xml est ignoré" << endl;
	exit(1);
}

int main(int argc, char* argv[]) {
	string xml_path; // Chemin XML passé en paramètre
	string dtd_path; // Chemin DTD éventuellement passé en paramètre
	validate_state state; // Status de la validation
// On verifie que l'utilisateur utilise le programme correctement
	switch (argc) { 
	case 1:
// Pas d'argument donné
		print_usage_exit();
	case 2: {
// Chemin XML fournis, DTD non fournis
		xml_path = string(argv[1]);
		cout << "Analyse de " << xml_path << endl;
		state = validate_xml(xml_path, "");
		break;
	}
	case 3: {
// Chemin XML et DTD fournis
		xml_path = string(argv[1]);
		dtd_path = string(argv[2]);
		cout << "Analyse de " << xml_path << " avec " << dtd_path << endl;
		state = validate_xml(xml_path, dtd_path);
		break;
	}
	default:
		print_usage_exit();
	}
	switch(state) {
	case OK: /* Le fichier xml est valide et conforme */
		cout << "Le XML respecte bien le document validation" << endl;
		return 0;
	case XML_VALID:	/* Le fichier xml est valide sans dtd */
		cout << "Le fichier XML est valide, mais aucun document de validation n'est fournie" << endl;
		return 0;
	case XML_NOT_CONFORM:	/* Le fichier xml est valide mais non conforme */
		cout << "Le fichier xml est valide mais non conforme au document de validation" << endl;
		return 1;
	case XML_INVALID:		/* Le fichier xml n'est pas un fichier xml */
		cout << "Le fichier XML n'est pas valide" << endl;
		return 1;
	case DTD_INVALID:		/* Le fichier dtd n'est pas un fichier dtd */
		cout << "Le fichier DTD n'est pas un fichier DTD valide" << endl;
		return 1;
	case XML_NOT_FOUND:		/* Le fichier xml est introuvable */
		cout << "Le fichier XML est introuvable" << endl;
		return 2;
	case DTD_NOT_FOUND:		/* Le fichier dtd est introuvable */
		cout << "Le fichier DTD est spécifié mais introuvable" << endl;
		return 2;
	default:
		cout << "Bug interne." << endl;
		return 3;
	}
	return 3;
}
